package application; import java.net.URL; import java.util.ResourceBundle; import java.util.Timer; import java.util.TimerTask; import org.parse4j.ParseException; import org.parse4j.callback.SaveCallback; import Util.Database; import Util.Note; import javafx.application.Platform; import javafx.beans.value.ChangeListener; import javafx.beans.value.ObservableValue; import javafx.event.ActionEvent; import javafx.event.EventHandler; import javafx.fxml.FXML; import javafx.fxml.Initializable; import javafx.scene.Node; import javafx.scene.control.Button; import javafx.scene.control.Label; import javafx.scene.control.TextArea; import javafx.scene.control.TextField; import javafx.scene.input.MouseButton; import javafx.scene.input.MouseEvent; import javafx.scene.layout.AnchorPane; import javafx.stage.Stage; public class NoteViewController implements Initializable { @FXML private TextField note_title; @FXML private Label label_save; @FXML private TextArea note_body; @FXML private AnchorPane note_pane; @FXML private Button note_close; private Note note; private double initialX; private double initialY; private double newX; private double newY; public void setTitle(String title) { note_title.setText(title); updateList(note); } public void setBody(String body) { note_body.setText(body); } public void setNote(Note note) { this.note = note; } public TextField getTitle() { return note_title; } public TextArea getBody() { return note_body; } @Override public void initialize(URL location, ResourceBundle resources) { note_pane.setOnMousePressed(new EventHandler<MouseEvent>() { @Override public void handle(MouseEvent me) { if (me.getButton() != MouseButton.MIDDLE) { initialX = me.getSceneX(); initialY = me.getSceneY(); } } }); note_pane.setOnMouseDragged(new EventHandler<MouseEvent>() { @Override public void handle(MouseEvent me) { if (me.getButton() != MouseButton.MIDDLE) { newX = me.getScreenX() - initialX; newY = me.getScreenY() - initialY; note_pane.getScene().getWindow().setX(newX); note_pane.getScene().getWindow().setY(newY); note_pane.requestFocus(); } } }); note_pane.setOnMouseReleased(new EventHandler<MouseEvent>() { @Override public void handle(MouseEvent me) { Database db = new Database(); db.update(note, me.getScreenX() - initialX, me.getScreenY() - initialY, true); note_pane.requestFocus(); } }); note_body.focusedProperty().addListener(new ChangeListener<Boolean>() { @Override public void changed(ObservableValue<? extends Boolean> arg0, Boolean oldPropertyValue, Boolean newPropertyValue) { if (!newPropertyValue) { if (note.getBody().equals(note_body.getText())) { return; } Platform.runLater(new Runnable() { @Override public void run() { note.setBody(note_body.getText()); setStatus("Saving..."); note.saveInBackground(new SaveCallback() { @Override public void done(ParseException e) { if (e == null) { setStatus("Saved!"); } else { setStatus("Failed!"); } } }); Database db = new Database(); db.update(note, newX, newY, true); updateList(note); } }); } } }); note_title.focusedProperty().addListener(new ChangeListener<Boolean>() { @Override public void changed(ObservableValue<? extends Boolean> arg0, Boolean oldPropertyValue, Boolean newPropertyValue) { if (!newPropertyValue) { if (note.getTitle().equals(note_title.getText())) { return; } Platform.runLater(new Runnable() { @Override public void run() { note.setTitle(note_title.getText()); setStatus("Saving..."); note.saveInBackground(new SaveCallback() { @Override public void done(ParseException e) { if (e == null) { setStatus("Saved!"); } else { setStatus("Failed!"); e.printStackTrace(); } } }); Database db = new Database(); db.update(note, newX, newY, true); updateList(note); } }); } } }); } @FXML protected void note_close(ActionEvent event) { Node source = (Node) event.getSource(); Stage stage = (Stage) source.getScene().getWindow(); Database db = new Database(); db.update(note, stage.getScene().getX() - initialX, stage.getScene().getY() - initialY, false); note.saveInBackground(); stage.close(); } private void updateList(Note note) { if (NoteController.items == null) { return; } for (int i = 0; i < NoteController.items.size(); i++) { Note tempNote = NoteController.items.get(i); if (tempNote.getID().equals(note.getID())) { NoteController.items.set(i, note); break; } } } private void setStatus(String status) { Platform.runLater(new Runnable() { @Override public void run() { label_save.setVisible(true); label_save.setText(status); new Timer().schedule(new TimerTask() { @Override public void run() { label_save.setVisible(false); } }, 2000); } }); } }